#include "client.h"
#include "../tools/toolsstring.h"
#include "../tools/charlist.h"

int main(int argc, char **argv)
{
  char continu = 1;
  char *host = NULL;
  char *port = NULL;
  int i;
  Client client;
  List *list;
  List *listFileUse;
  if (argc != 5)
    {
      fprintf(stderr, "Usage %s -h <host> -p <numero de port port>\n", argv[0]);
      exit(1);
    }
  if (argv[1][1]=='h')
    {
      host = argv[2];
    }
  else if(argv[1][1] == 'p')
    {
      port=argv[2];
    }
  
  if(argv[3][1]=='p')
    {
      port=argv[4];
    }
  else if(argv[3][1] == 'h')
    {
      host = argv[4];
    }
  if(host == NULL || port == NULL)
    {
      fprintf(stderr, "Usage %s -h <host> -p <numero de port port>\n", argv[0]);
      exit(1);
    }
  initialize_Client(&client, host, port, "localhost");
  if(connexion_Client(&client) == -1)
    {
      testament_Client(&client);
      fprintf(stderr, "Erreur de connexion\n");
      exit(1);
    }
  waitHello_Client(&client);
  while(continu)
    {
      int cRet = 0;
      char ret;
      char *file = NULL;
      printf("\rMenu :\n1 : Liste des fichiers\n2 : Avoir le fichier\n3 : Libérerer un fichier\n4 : Quitter\nVotre choix : ");
      fflush(stdout);
      ret = getchar();
      while(getchar() != '\n');
      switch(ret)
	{
	case '1':
	  getListFile_Client(&client);
	  printf("Numéro du fichier\tFichier\n");
	  list = getLFile_Client(&client);
	  first_List(list);
	  for(i = 1; i <= getSize_List(list); i++)
	    {
	      printf("%d : \t%s\n", i, (char *) getDataCurrent_List(list));
	      next_List(list);
	    }

	  break;
	case '2':
	  list = getLFile_Client(&client);
	  if(getSize_List(list) == 0)
	    {
	      if(isHaveList_Client(&client) == CLIENT_HAVE)
		printf("Il n'y a pas de fichier à télécharger sur le serveur.\n");
	      else
		printf("Prenez d'abord la liste de fichier...\n");
	      break;
	    }
	  printf("Entrez le numéro du fichier à télécharger : ");
	  fflush(stdout);
	  getString_ToolsString(&file);
	  i = atoi(file);
	  free(file);
	  if(i <= 0 || i > getSize_List(list))
	    break;

	  printf("Entrer le nom du fichier à sauvegarder (%s) : ", (char *)getDataAt_List(list, i - 1));
	  fflush(stdout);
	  getString_ToolsString(&file);
	  cRet = getFile_Client(&client, getDataAt_List(list, i - 1), file, NULL);
	  if(cRet != CLIENT_SUCCESS)
	    {
	      free(file);
	      file = getMessageReturn_Client(cRet);
	      printf("Erreur de réception : %s\n", file);
	      free(file);
	      break;
	    }
	  free(file);
	  break;
	case '3':

	  listFileUse = getLFileUse_Client(&client);
	  if(getSize_List(listFileUse) == 0)
	    {
	      printf("Aucun fichier à libérer...\n");
	      break;
	    }
	  first_List(listFileUse);
	  for(i = 1; i <= getSize_List(listFileUse); i++)
	    {
	      printf("%d : \t%s\n", i, (char *) getDataCurrent_List(listFileUse));
	      next_List(listFileUse);
	    }
	  printf("Entrer le numéro du fichier à libérer : ");
	  fflush(stdout);
	  getString_ToolsString(&file);
	  i = atoi(file);
	  if(i > 0 && i <= getSize_List(listFileUse))
	    {
	      int retour;
	      char *msg;
	      retour = freeFile_Client(&client, getDataAt_List(listFileUse, i - 1));
	      msg = getMessageReturn_Client(retour);
	      if(msg != NULL)
		printf("%s\n", msg);
	    }
	  free(file);
	  break;
	case '4':
	  quit_Client(&client);
	  continu = 0;
	  break;
	default:
	  printf("Pas encore dans le menu :S\n");
	  break;
	}
    }
  testament_Client(&client);
  printf("Bye :)\n");
  return 0;
}
